// 从商品联邦模块导入领域层资源
import {ProductRepository} from "@domains/product/ports/repositories/ProductRepository";
import {HttpProductRepository} from "@domains/product/infr/api/HttpProductRepository";
import {ProductApplicationService} from "@domains/product/application/services/ProductApplicationService";

/**
 * 商品领域的依赖注入配置
 * 将 接口 与 具体实现 绑定
 * 
 * 优点：是一个依赖工厂，它隐藏了对象创建的细节，
 * 让业务代码只需要关心 “做什么”，而不用关心 “依赖从哪里来”
 * 所有依赖关系都在di目录下集中配置，一目了然，后续维护时能快速找到所有依赖的创建逻辑。
 * 
 * 松耦合：
 * 业务代码（ProductApplicationService）只依赖抽象接口（ProductRepository），
 * 不依赖具体实现。如果未来需要改用其他数据来源（比如 WebSocket），
 * 只需修改bindProductRepository的返回值，无需改动业务逻辑。
 * 
 * 易于测试：
 * 测试时可以临时替换为模拟实现
 * productModule.bindProductRepository = () => new MockProductRepository();
 * 这样测试就可以脱离真实 API，使用预设的模拟数据。
 */
export const product = {

    // 绑定 仓储抽象接口 到 HTTP具体实现
    bindProductRepository: (): ProductRepository => {
        // return new MockProductRepository 直接从真实接口数据改为测试模拟数据
        return new HttpProductRepository;
    },

    // 创建应用服务实例
    createProductApplicationService: (): ProductApplicationService => {
        return new ProductApplicationService(
            product.bindProductRepository()
        );
    }
}